home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 24
/
AACD 24.iso
/
AACD
/
Programming
/
2b_CreativE
/
src
/
main.s
< prev
next >
Wrap
Text File
|
2001-07-09
|
13KB
|
603 lines
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
; ;
; Amiga E Compiler/Assembler/Linker by $#%! in 1991/92/93/94/95 ;
; CreativE 2.12 by Tomasz Wiszkowski (error/bb) ;
; ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;
CREATIVE_VERSION: MACRO
DC.B "CreativE "
DC.B "2.12.3 (09.07.01)"
DC.B " by Tomasz Wiszkowski (Error/bla²)",10
ENDM
VERSION_020 EQU 0 ; just a couple of changes; no speedup...
DEBUG_TYPE: macro
IFNE DEBUG_MSGS
MOVEM.L D0-A6,-(A7)
MOVE.L #.dbg,D2
MOVE.L #.edbg-.dbg,D3
JSR WRITECON
move.l #EXAMPLE,d2
move.l #2,d3
JSR WRITECON
MOVEM.L (A7)+,D0-A6
BRA .edbg
.dbg: DC.B \1
even
.edbg:
endc
endm
IFEQ VERSION_020
GOSR: MACRO
JSR \1
ENDM
ELSE
GOSR: MACRO
BSR.L \1
ENDM
ENDC
S: MOVE.L A7,INITSTACK
GOSR INITALL
;; check stack
MOVE.L D0,D7
MOVE.L A0,A5
MOVE.L $4.W,A6
MOVE.L 276(a6),a1
MOVE.L 62(A1),D1
SUB.L 58(A1),D1
CMP.L #20000,D1
; BPL .NUFF
; MOVE.L #80000,D0
; BSR NEW
; BEQ iERROR38
; ADD.L #80000,D0
; MOVE.L D0,A7
blt iERROR108
MOVE.L A5,A0
MOVE.L D7,D0
.NUFF:
;*-*
GOSR INITBUFFERS
GOSR CLEARHASHTAB
GOSR SETVARS
GOSR MAKEKEYHASH
GOSR MAKEASMHASH
GOSR SETUPLIBS
GOSR INITFUNCS
GOSR ADDGLOBVARS
GOSR GETCACHE
GOSR CHECKCOOKIES
GOSR TOKENIZE
GOSR CHECKCOOKIES
GOSR SECONDARYLOAD
GOSR CHECKIDENTS
GOSR SWAPVALUES
GOSR MAKEINITCODE
GOSR CHECKCOOKIES
GOSR DOARGMACROS
GOSR PASS1
GOSR CHECKCOOKIES
GOSR LINKDELEGATECONSTRUCTORS
GOSR MAKEEXITCODE
GOSR MATHEXITETC
GOSR LINKFUNCS
GOSR LINKLIB
GOSR APPEND_LISTS
GOSR CALCADR
GOSR WRITEEXE
GOSR WRITELIBMOD
GOSR CHECKCOOKIES
GOSR NOERROR
GOSR WRITEBUFFERS
GOSR CLEANUPALL
GOSR FIXRETVALUE
MOVE.L INITSTACK,A7
RTS
K: BSET #6,CODEPREFS+3 ; -w
BRA S
SC: MOVE.L #CLINE,A0
MOVEQ #CLEND-CLINE,D0
BRA S
CLINE: DC.B " ",10
CLEND:
EVEN
EXAMPLE:
DC.B " ",10
EXAMPLEEND:
DC.B 10,10
EVEN
;; Ident types
; No more demoversions!
UNDEF = 0 ; ident types
LOCV = 1
GLOBV = 2
LAB = 3
;*-*
;; interim codes
EOI = 0 ; interimcodes
VALUE = 1
LIBC = 2
COM = 3
ASSGN = 4
IDENT = 5
STR = 6
;*-*
;; Object structure
ONEXT = -4 ; M O OBJECT STRUCTURE OFFSETS
OOFF = 0 ; M M=MEMBER
ODEL = 0 ; O O=OBJECT
OFLAGS = 2 ; M O
OSIZE = 4 ; M O
OID = 6 ; M O
OASCII = 8 ; M O
OPTRTYPE= 12 ; M
OSIZEOF = 16 ; M
OMEMB = 12 ; O
OMETHOD = 16 ; O
OSUPER = 20 ; O
ODCODE = 24 ; O
OACC = 28 ; O
ODELOFF = 32 ; O
ODESTR = 34 ; O
;*-*
;; Hunklist structure
H_NEXT = -4 ; ptr to hunk
H_ADDR = 0 ; where it begins..
H_TYPE = 4 ; it's type
H_END = 8 ; where it ends..
H_PREV = 12 ; previous
H_RELO = 16 ; relocs (longs!)
R_NEXT = -4 ; reloc next
R_HUNK = 0 ; destination hunk number
R_OFF = 2 ; source hunk offset
;*-*
;; Lib structure
LIB_NEXT = -4 ; next
LIB_NAME = 0 ; name
LIB_ARGS = 4 ; args count
LIB_CLEN = 6 ; code len
LIB_CODE = 10 ; code itself
LIB_USED = 14 ; set if used/position in code
LIB_TYPE = 18 ; type (0=proc, 1=inline, 2=startup etc)
LIB_TARR = 20 ; table args array - regs (inline only)
LIB_RELO = 28 ; reloc
LIB_XTNS = 32 ; extension - for XREFs and XDEFs.
LIB_CPU = 36 ; required CPU
LIB_FPU = 38 ; required FPU
LIB_MMU = 40 ; required MMU
LIB_OSVERS = 42 ; required os version
LIB_SIZE = 44 ; SIZEOF lib
;*-*
;; Method structure
M_NEXT = 0 ; METHOD
M_PROC = 4
M_TYPE = 8
M_FLAGS = 9
M_OFF = 10
M_NAME = 12
;*-*
;; method flags
MT_METHOD = 0 ; METHODFLAGS
MT_FROZEN = 1
MT_SHARED = 2
MT_EMPTY = 3
;*-*
;; module info
MI_NEXT = 0 ; MODULEINFO
MI_FLAGS = 4
MI_NAMELEN = 6
MI_MOD = 10
MI_LIST = 14
MI_NAMEPTR = 18
;MI_NAME = 22 ; ARRAY FROM HERE...
;*-*
;; proc or class
PC_NEXT = 0 ; PROC_OR_CLASS
PC_TYPE = 4
PC_INFO = 6
PC_ACC = 10
;*-*
;; constants structure
CNEXT = 0 ; CONST STRUCTURE OFFSETS
CASCII = 4
CVAL = 8
CFLAGS = 12
;*-*
CURVERSION = 11 ; IMPORTANT, MODULE VERSION!!
;; system consts
SKIPMARK = $8000
MAXREGVARS = 5 ; NOTE: DEPENDS ALSO ON EFUNCS!
MAXMULTRET = 3 ; NOTE: DEPENDS ON REGVARS!
MIDHEAVY = $100
VARHEAVY = 12 ; OFFSET AT WHICH HEAVYINFOS IN ID
MINSTACKSIZE = 10000 ; van gen. code
MINSTACKSIZELIB = 1500
MAXOBJSIZE = 5000
;*-*
;; A4handle
CHOPMEM = -100
CHOPLEFT = -104
FMEMSIZE = 5000
GLOBOFF = -512
GLOBOFFNEWTAB = GLOBOFF+16 ; 16..256+16
NEWTABMAX = 256
;*-*
;; customs
IOFF = 100
KB = 1024
MAXIDENT = 1000 ; size of *one* identifier
MAXSTACK = 30000 ; each rec.step=6-10b+rec.databuffer
MAXLIBRAISE = 200 ; EACH = 10 BYTES
;*-*
MINIMUM_ACODE = 100*KB ; GENERATED CODE-BUF
;; MACRO SECTION
;; TSTMOD - check if we're in a module
TSTMOD: MACRO
BTST #4,CODEPREFS+2
ENDM
;*-*
;; RANGE CHECK MACROS
;; CheckB
CHKB: MACRO ; \1=REG, \2=TRREG, \3=ERLAB
MOVE.L \1,\2
BTST #31,\2
BEQ.S *+4
NEG.L \2 ; BAD: RANGE=(-255,255)=>(-128,255)
clr.b \2
TST.L \2
BNE \3
ENDM
;*-*
;; CheckW
CHKW: MACRO ; \1=REG, \2=TRREG, \3=ERLAB
MOVE.L \1,\2
BTST #31,\2
BEQ.S *+4
NEG.L \2
SWAP \2
TST.W \2
BNE \3
ENDM
;*-*
;*-*
;; HASHING MACROS
;; HashC
HASHC: MACRO ; \1=HASHREG, \2=CHAR
LSL.W #4,\1
ADD.B \2,\1
ENDM
;*-*
;; HashE
HASHE: MACRO ; \1=HASHREG
DIVU #211,\1
SWAP \1
EXT.L \1
ENDM
;*-*
;; Hash
HASH: MACRO ; \1=ASCREG, \2=DATREG, \3=TRASHREG
MOVEQ #0,\2
.H1:MOVE.B (\1)+,\3
BEQ.S .H2
HASHC \2,\3
BRA.S .H1
.H2: HASHE \2
ENDM
;*-*
;*-*
;; APART VAR ACCESS: ASM_GETLABEL
;; GENGI - GENerateGlobalInfo: A4=MID INS.
GENGI: MACRO ; \1=IDENTREC, \2=TRASHDX
MOVE.L 6(\1),\2 ; SEE IF WE HAVE TO ADD A GLOBINFO ENTRY
BEQ.S .GVNGI
MOVEM.L \1/A3,-(A7)
MOVE.L \2,\1
MOVE.L 4(\1),\2
MOVE.L \1,A3
GETM \1
MOVE.L \1,4(A3)
MOVE.L \2,(\1)+
MOVE.L A4,(\1)+
MOVE.W OPERSIZE,(\1)+
DONEM \1
MOVEM.L (A7)+,\1/A3
.GVNGI:
ENDM
;*-*
;; OpLong - Set operator size
OPLONG: MACRO
MOVE.W #4,OPERSIZE
ENDM
;*-*
;; OpInt
OPINT: MACRO
MOVE.W #2,OPERSIZE
ENDM
;*-*
;; OpChar
OPCHAR: MACRO
MOVE.W #1,OPERSIZE
ENDM
;*-*
;; GenVar
; OFF_1:IMM, IDENT_2:Ax, OFFSET_3:EA.W, THRASH_4:Dx
; NOT A3-A5!!
GENVAR: MACRO
MOVE.B 4(\2),\4
BNE .1
JMP ERROR22 ; TEST FOR UNIDENT
.1:
CMP.B #GLOBV,\4
BNE.S .GV1
MOVE.W -2(A4),\4
BCLR #\1,\4 ; ADJUSTMODE
MOVE.W \4,-2(A4)
GENGI \2,\4
.GV1: BTST #3,5(\2) ; SEE IF REGVAR
BNE.S .GV2
MOVE.W \3,(A4)+
BRA.S .GV3
.GV2: MOVE.W 10(\2),\4
IFEQ \1
ANDI.W #%1111111111000000,-2(A4)
ELSE
AND.W #%1111000000111111,-2(A4)
LSL.W #8,\4
LSL.W #1,\4
ENDC
OR.W \4,-2(A4)
.GV3: ; END
ENDM
;*-*
MOVEMS: MOVEM.L D0/D1,-(A7)
MOVEMR: MOVEM.L (A7)+,D0/D1
SMASK: DC.W 0
;*-*
;; BitM
BITM: MACRO ; \1=BITNUM, \2=REG
BTST #\1,\2
BEQ.S .SR\1
BSET #15-\1,\2
.SR\1:
ENDM
;*-*
;; LSaver
LSAVER: MACRO ; \1=SAVEMASK.EA.W, \2=RETURN_SMASK.DX
MOVE.W \1,\2
AND.W #%11111000,\2 ; diffr. from SAVER
MOVE.W \2,SMASK
BEQ.S .NOSR
MOVE.W MOVEMS,(A4)+
BITM 7,\2
BITM 6,\2
BITM 5,\2
BITM 4,\2
BITM 3,\2
CLR.B \2
MOVE.W \2,(A4)+
MOVE.W SMASK,\2
.NOSR: ; \2 IS HERE ATLEAST BOOL
ENDM
;*-*
;; Saver
SAVER: MACRO ; \1=SAVEMASK.EA.W, \2=RETURN_SMASK.DX
MOVE.W \1,\2
AND.W PROCMASK,\2
MOVE.W \2,SMASK
BEQ.S .NOSR
MOVE.W MOVEMS,(A4)+
BITM 7,\2
BITM 6,\2
BITM 5,\2
BITM 4,\2
BITM 3,\2
CLR.B \2
MOVE.W \2,(A4)+
MOVE.W SMASK,\2
.NOSR: ; \2 IS HERE ATLEAST BOOL
ENDM
;*-*
;; Restr
RESTR: MACRO ; \1=SMASK.EA
TST.W \1
BEQ.S .NORR
MOVE.W MOVEMR,(A4)+
MOVE.W \1,(A4)+
.NORR:
ENDM
;*-*
;; Lower
LOWER: MACRO ; \1=AX (STRING,TRASH), \2=(TRASH)
.LOWL: MOVE.B (\1),\2
BEQ.S .LOWO
CMP.B #"A",\2
BMI.S .LOWN
CMP.B #"Z"+1,\2
BPL.S .LOWN
BSET #5,\2;ADD.B #32,\2
.LOWN: MOVE.B \2,(\1)+
BRA.S .LOWL
.LOWO: ; ax points at 0-byte at end string
ENDM
;*-*
;; Lower2
LOWER2: MACRO ; \1=AX (STRING,TRASH), \2=(TRASH)
.LOWL2: MOVE.B (\1),\2
BEQ.S .LOWO2
CMP.B #"A",\2
BMI.S .LOWN2
CMP.B #"Z"+1,\2
BPL.S .LOWN2
BSET #5,\2;ADD.B #32,\2
.LOWN2: MOVE.B \2,(\1)+
BRA.S .LOWL2
.LOWO2: ; ax points at 0-byte at end string
ENDM
;*-*
;; FAST MEMORY ALLOCATION MACROS
;; GetM
GETM: MACRO ; \1=Ax (START USING MEM)
MOVE.L HEAP,\1
ENDM
;*-*
;; DoneM
DONEM: MACRO ; \1=Ax (DONE WITH MEM (LIGHT VERSION))
MOVE.L \1,HEAP
SUBQ.W #1,CHECKHEAP
BNE.S *+16
JSR EXPAND5
MOVE.W #5,CHECKHEAP ; MAX 200 BYTES EACH = IDENT OR STRUCT
ENDM ; doesn't trash \1 !!!!
;*-*
;; DoneH
DONEH: MACRO ; \1=Ax (HEAVY VERSION)
MOVE.L \1,HEAP
BSR.L EXPAND5
ENDM
;*-*
;*-*
;; CREATE GLOBINFO STRUCTURE FOR IDENT
;; GInfo
GINFO: MACRO ; \1=ASCIIPTR.EA, \2=TRASH.AX, \3=IDENTPTR.AX
TSTMOD
BEQ.S .NGINF
GETM \2 ; BUILD "GLOBINFO"
BTST #1,5(\3)
BNE.S .NGINF
MOVE.L \2,6(\3)
MOVE.L \1,(\2)+
CLR.L (\2)+
DONEM \2
BRA.S .NGOUT
.NGINF: CLR.L 6(\3)
.NGOUT:
ENDM
;*-*
;; ChEStB
CHESTB: MACRO ; CHeckEStackBuf \1=CURBUF.EA, \2=TR.DX
SUBQ.W #1,.BC ; \3=DIST, \4=ERROR
BNE.S .NC
MOVE.W #\3,.BC
MOVE.L #ESTACKBUF,\2
ADD.L #MAXSTACK,\2
SUB.L #1000,\2
CMP.L \1,\2
BMI \4
BRA.S .NC
.BC: DC.W \3
.NC:
ENDM
;*-*
;; INTERN
INTERN: MACRO ; \1=ERRNUM
MOVE.W #\1,GURUNUM
BRA.L DAMAGEDCOOKIES
ENDM
;*-*
;*-*
;*-*
INCDIR ""
INCLUDE 'PPC.I'
INCLUDE 'PREPROCESSOR.S'
INCLUDE 'INTERNAL1.S'
INCLUDE 'PARSE.S'
INCLUDE 'IDENT.S'
INCLUDE 'ASSEMBLER.S'
INCLUDE 'ERROR1.S'
INCLUDE 'CHKIDENT.S'
INCLUDE 'IO1.S'
INCLUDE 'CACHE.S'
INCLUDE 'INTERNAL2.S'
INCLUDE 'IO2.S'
INCLUDE 'INTERNAL3.S'
INCLUDE 'COMPILER.S'
INCLUDE 'APPENDLISTS.S'
INCLUDE 'ADDRESS.S'
INCLUDE 'EXPRESSIONS.S'
INCLUDE 'ERROR2.S'
INCLUDE 'LINKER.S'
INCLUDE 'FUNCTIONS.S'
INCLUDE 'DATAS.S'
;; BBS section
; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
; UnInitialized DataSection for E Compiler ;
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;
SECTION EDATA,BSS
FIB: DS.B 300
EVEN
NAMEBUF: DS.B 300
EVEN
PROCBUF: DS.B 300
EVEN
SRCDIRBUF: DS.B 300
EVEN
DIRNAME: DS.B 300
EVEN
PRINTBUF: DS.B 300
EVEN
STCNAME: DS.B 256
EVEN
WORKBUF: DS.B MAXIDENT+2
EVEN
ESTACKBUF: DS.B MAXSTACK+2
EVEN
EFUNCBYTE: DS.B NREFUNC+10
EVEN
EFUNCRAISE: DS.B (NREFUNC+10)*10
EVEN
LIBRAISE: DS.B MAXLIBRAISE*10
EVEN
BRACKETSBUF: DS.B MAXBRACK*4
EVEN
HASHBUFS: ; CONTIGUOUS BLOCKS
KEYHASH: DS.B 1024
ASMHASH: DS.B 1024
AKWHASH: DS.B 1024
PPCHASH: DS.B 1024
CONSTHASH: DS.B 1024
IDENTHASH: DS.B 1024
MACROHASH: DS.B 1024
LIBHASH: DS.B 1024
DS.B -GLOBOFF
PSEUDOA4:
ENDHASHBUFS:
;*-*
END